import pygtk
import gtk.glade
import gobject
import gtk
import os, time

from dao.AlumnosDao import AlumnosDao
from dao.EscuelasDao import EscuelasDao
from dao.Alumnos_LeccionesDao import Alumnos_LeccionesDao

from model.Alumnos import Alumnos
from model.Escuelas import Escuelas
from model.Sesion import Sesion
from model.Alumnos_Lecciones import Alumnos_Lecciones

from sync import sync

'''Ventana de confirmacion'''
class ModalDialog(gtk.Dialog):
    """Es la ventana de confirmacion del boton Responder."""
    def __init__(self, master=None):
        """Initialize a new instance."""
        gtk.Dialog.__init__(self)
        self.master = master
        self.set_modal(True)
        if self.master:
            self.set_transient_for(self.master)
            
        # Destroy
        self.connect("delete_event", self.deleteEH)
        
    def runModal(self):
        """Despliega el Dialog e inicia el evento loop."""
        self.show()
        gtk.main()

    def endModal(self, *args):
        """Terminate the modal event loop and dismiss the dialog."""
        self.hide()
        gtk.main_quit()

    def deleteEH(self, *args):
        """Event handler invoked when the dialog is deleted."""
        self.endModal()
        # The return value tells Gtk+ that the delete event has
        # been processed.  Without a return value of true, Gtk+
        # will provide the default deletion behavior:  it will destroy
        # self's visuals.
        return True


class P2_bienvenida():
	def __init__(self, runaslib=True, padreSugar=None):
		self.runaslib = runaslib
		self.padreSugar = padreSugar
		# Se carga el .glade
		self.xml = gtk.glade.XML(padreSugar.GLADE_P2_BIENVENIDA)

		# Se carga el window
		self.w = self.xml.get_widget('winlogin')
		self.w.connect("delete_event", gtk.main_quit)
		
		# Cargamos el contenido de la ventana,xq el sugar ya pone la ventana
		self.w_child = self.w.get_child()
			
		self.inicializar_componentes()
		self.inicializar_cabecera()

		# self.widget se linkea con la activida
		# puede ser cualquier widget menos window..x lo q dije mas arriba
		self.widget = self.w_child

		if not runaslib:
			self.w.show_all()
			gtk.main()


	
	#Instancia los componentes graficos
	def inicializar_componentes(self):
		self.gui_nombreEscuela = self.xml.get_widget("nombreEscuela")
		self.gui_idalumno = self.xml.get_widget("idalumno")
		self.gui_nombre = self.xml.get_widget("nombre")
		self.gui_apellido = self.xml.get_widget("apellido")
		self.gui_estado_datastore = self.xml.get_widget("estado_datastore")
		self.gui_estado_ws = self.xml.get_widget("estado_ws")

                dic = {	"on_comenzar_clicked" : self.comenzar,
			"on_consultar_ds_clicked" : self.consultar_ds,
			"on_invocar_ws_clicked" : self.invocar_ws,
			"on_borrar_ds_clicked" : self.borrar_ds,
			"on_cargar_alumnos_clases_ds_clicked" : self.cargar_alumnos_clases_ds, 
			"on_winlogin_destroy" : gtk.main_quit}
		self.xml.signal_autoconnect(dic)


	#Muestra el nombre y escuela del alumno
	def inicializar_cabecera(self):
		self.daoAlumno = AlumnosDao()
		self.daoEscuelas = EscuelasDao()
		self.dalAlumnoLecciones = Alumnos_LeccionesDao()
		self.alumno = self.daoAlumno.obtener()

		self.gui_idalumno.set_text(self.alumno.idAlumno)
		self.gui_idalumno.set_editable(False)

		self.gui_nombre.set_text(self.alumno.nombre)
		self.gui_nombre.set_editable(False)

		self.gui_apellido.set_text(self.alumno.apellido)
		self.gui_apellido.set_editable(False)

		self.gui_nombreEscuela.set_text(str(self.alumno.idEscuela))
		self.gui_nombreEscuela.set_editable(False)

	def comenzar(self, widget):
		#Crear Estudiante si no existe
		
		e = Estudiante(self.obtenerIdEstudiante(), self.gui_nombreEscuela.get_text(), self.gui_nombre.get_text(), self.gui_apellido.get_text(),  "", "", "", 0)
		self.estDao.guardarEstudiante(e)

		self.estudiante = self.estDao.obtenerEstudiante()

		estAnimo = self.obtenerEstadoAnimo()
		ayudaPadres = self.obtenerAyudaPadres()
		desdeHogar = self.obtenerDesdeHogar()

		if(estAnimo != None and ayudaPadres != None and desdeHogar != None):
			#Crear la sesion
			nvaSesion = Sesion(self.estudiante.getIdEstudiante(), None, time.strftime("%Y%m%d%H%M%S", time.localtime()), None, estAnimo, ayudaPadres, desdeHogar)
			nvaSesion = self.estDao.guardarSesion(nvaSesion)
		
			#Crear el estado en memorpara esta sesion
			actEstado = Estado(nvaSesion, None, None, None, nvaSesion.getIdSesion())
			d = self.estadoDao.guardarEstado(actEstado)
	
			self.padreSugar.cargarLecciones()
		else:
			self.buildDialog("Debe elegir: (*) su estado de animo, (*) Si hoy le van a ayudar sus padres y (*) Si esta en su casa.")
		
	def sincronizargui(self, widget):
		r = self.padreSugar.sincronizar(widget)
		resultado = "Envio de Resultados y Descarga de contenidos = " + str(r)
		self.buildDialog(resultado)

	def obtenerIdEstudiante(self):
		try:
			serial_no = self.read_file('/ofw/serial-number')
		except: 
			serial_no = 'Fallo Leer Archivo'

		if serial_no == None:
			serial_no = '_not_available'
		return serial_no[:11]

	def read_file(self, path):
		if os.access(path, os.R_OK) == 0:
			return None
		fd = open(path, 'r')
		value = fd.read()
		fd.close()
		if value:
			value = value.strip('\n')
			return value
	    	else:
			#print('No information in file or directory: %s', path)
			return None

	def obtenerEstadoAnimo(self):
		animoMarcado = ""
		f = self.gui_feliz.get_active()
		t = self.gui_triste.get_active()
		e = self.gui_enamorado.get_active()
		s = self.gui_suenho.get_active()
		ning = self.gui_ninguno.get_active()
		if (not ning):
			if(f): animoMarcado = "F"
			if(t): animoMarcado = "T"
			if(e): animoMarcado = "E"
			if(s): animoMarcado = "S"
			return animoMarcado
		else:
			return None


 	# Retorna None si no completo
	# Retorna False o True si esta completo
	def obtenerAyudaPadres(self):
		ret = None
		si = self.gui_ayuda_padres_si.get_active()
		no = self.gui_ayuda_padres_no.get_active()
		ninguno = self.gui_ayuda_padres_ninguno.get_active()
		if (ninguno == False):
			if(si): ret = True
			if(no): ret = False
			return ret
		else:
			return None

	def obtenerDesdeHogar(self):
		ret = None
		si = self.gui_desde_hogar_si.get_active()
		no = self.gui_desde_hogar_no.get_active()
		ninguno = self.gui_desde_hogar_ninguno.get_active()
		if (ninguno == False):
			if(si): ret = True
			if(no): ret = False
			return ret
		else:
			return None


        def buildDialog(self, etiq):
		"""Build a sample modal dialog."""
		result = ModalDialog(master=self.padreSugar)
		result.set_position(gtk.WIN_POS_MOUSE)
		result.set_title("Informe.")
		result.resize(200,100)
            	
		label = gtk.Label(etiq)
            	result.vbox.pack_start(label, padding=5)
            	label.show()

            	closeBtn = gtk.Button("Cerrar")
            	closeBtn.connect("clicked", result.endModal)
		closeBtn.show()
		result.runModal()

	def consultar_ds(self, widget):
		alum = self.daoAlumno.obtener()
		alumlec = self.daoAlumno.obtenerListaAlumnoLecciones()
		escuelas = self.daoEscuelas.obtenerLista()
		escuelasHab = self.daoEscuelas.obtenerClasesHabilitadas()

		textBuff = gtk.TextBuffer()
		texto = " * Alumno = "
		if alum == None:
			texto = " * Alumno = No existe "
		else:
			texto = " * Alumno = "+ alum.idAlumno + "#"+ alum.nombre + "#" + alum.apellido + "# idEscuela = " + str(alum.idEscuela)


		texto = texto + "\n\n * Lecciones Alumnos = "
		if alumlec == None:
			texto = texto + " No existe"
		else:		
			for k, v in alumlec.iteritems():
				texto = texto + k + "\n"

		texto = texto + "\n\n * Escuelas = "
		if escuelas == None:
			texto = texto + " No existe"
		else:
			for esc in escuelas:
				texto = texto + "\t" + str(esc.idEscuela) + "#" + esc.nombre + "#" + esc.ciudad + "\n"


		texto = texto + "\n\nClases Habilitadas = "
		if escuelasHab == None:
			texto = texto + " No existe"
		else:			
			for k in escuelasHab:
				texto = texto + k + "\n"


		textBuff = gtk.TextBuffer()
		textBuff.set_text(texto)
		self.gui_estado_datastore.set_buffer(textBuff)
		self.buildDialog("CONSULTAR DS correctamente")

	def invocar_ws(self, widget):
		t = ""
		ws = sync()
		alumno = self.daoAlumno.obtener() 
		if (alumno == None):
			alumno = Alumnos('ci3298639fl', 'Nombre generado', 'Apellido generado', 'ci3298639fl', 0)
			self.daoAlumno.guardar(alumno)


		R1 = ws.registrarAlumno()
		t = " * registrarAlumno = " + str(R1)

		R2 = ws.registrarAlumnosClases()
		t = t + "\n * registrarAlumnosClases = " + str(R2)


		R3 = ws.obtenerEscuelas()
		t = t + "\n\n * obtenerEscuelas = " 
		for estr in R3:
			t = t + "\n\t\t" +  str(estr)
			#e = s.str2escuela(estr)
			#t = t + "\n\t\t" +  str(e.idEscuela) + "#" + e.nombre + "#" + e.ciudad

		R4 = ws.obtenerClasesHabilitadas()
		t = t + "\n\n * obtenerClasesHabilitadas = " 
		for e in R4:
			t = t + "\n\t\t" +  str(e) 

		textBuff = gtk.TextBuffer()
		textBuff.set_text(t)
		self.gui_estado_ws.set_buffer(textBuff)
		self.buildDialog("INVOCAR - WS correctamente")

	def borrar_ds(self, widget):
		self.daoAlumno.borrarAlumno()
		self.daoAlumno.borrarAlumnoLecciones()
		self.daoEscuelas.borrarEscuela()
		self.daoEscuelas.borrarClasesHabilitadas()

		self.buildDialog("BORRADO DS correctamente")
		self.consultar_ds(widget)


	def cargar_alumnos_clases_ds(self, widget):
		alum = self.daoAlumno.obtener()
		self.daoAlumno.guardarAlumnoLecciones(1,1)
		self.daoAlumno.guardarAlumnoLecciones(1,2)
		self.daoAlumno.guardarAlumnoLecciones(1,5)
		self.daoAlumno.guardarAlumnoLecciones(1,6)
		self.daoAlumno.guardarAlumnoLecciones(2,2)
		self.daoAlumno.guardarAlumnoLecciones(3,1)
		self.daoAlumno.guardarAlumnoLecciones(3,4)


if __name__ == '__main__':

	path = '/ofw/serial-number'
	if os.access(path, os.R_OK) == 0:
		print('No hay')

	fd = open(path, 'r')
	value = fd.read()
	fd.close()

	if value:
		value = value.strip('\n')
	else:
		print('No information in file or directory: %s', path)

	if value == None:
		value= "_not_available"
	print value[:11]
	print value
